package com.mlh.binarytree;

/**
 * @author 缪林辉
 * @date 2024/3/26 11:56
 * @DESCRIPTION
 */
// 给你一个二叉树的根节点 root ， 检查它是否轴对称。就是以根节点为切割线，左右两边对称，并且节点的val也要相同
public class 对称二叉树 {
    //看题解自己写出
    // 根据题目的描述，镜像对称，就是左右两边相等，也就是左子树和右子树是相当的。
    // 注意这句话，左子树和右子相等，也就是说要递归的比较左子树和右子树。
    // 这边的左子树和右子树除了根节点外，指的并不是一个节点上的左子树和右子树，而是对称的两侧
    // 我们将根节点的左子树记做 left，右子树记做 right。比较 left 是否等于 right，不等的话直接返回就可以了。
    public boolean method1(TreeNode root) {
        return recursion(root.left, root.right);
    }

    public boolean recursion(TreeNode left, TreeNode right) {
        if (left != null && right == null || left == null && right != null) {
            return false;
        } else if (left == null && right == null) {
            return true;
        }
        boolean b1 = recursion(left.left, right.right);
        boolean b2 = recursion(left.right, right.left);
        boolean b3 = left.val == right.val;
        return b1 && b2 && b3;
    }

    public boolean practice(TreeNode root) {
        return recursionPractice(root.left,root.right);
    }

    private boolean recursionPractice(TreeNode left,TreeNode right) {
        if(left==null){
            return right==null;
        }
        if(right==null){
            return left==null;
        }
        boolean b1 = recursionPractice(left.left, right.right);
        boolean b2 = recursionPractice(left.right, right.left);
        boolean b3=left.val==right.val;
        return b1&&b2&&b3;
    }

    public boolean practice2(TreeNode root) {
        return recursionPractice2(root.left,root.right);
    }

    private boolean recursionPractice2(TreeNode left,TreeNode right) {
        if(left==null&&right!=null||left!=null&&right==null){
            return false;
        }
        if(left==null&&right==null){
            return true;
        }
        if(left.val!=right.val){
            return false;
        }
        return recursionPractice2(left.left,right.right)&&recursionPractice2(left.right,right.left);
    }
}
